/**
 * Date:2021年10月13日 上午9:46:46
 * Copyright (c) 2021, www.bwbroad.com All Rights Reserved
 */

package com.xue.redis;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

/**
 * Description: 监听mystream 队列<br/>
 * Date:2021年10月13日 上午9:46:46 <br/>
 * 
 * @author xuejianxin
 */
@Component
public class MystreamProducer implements InitializingBean {
	@Autowired
	RedisTemplate<String, String> redisTemplate;

	// 保证在spring 初始化后执行
	@Override
	public void afterPropertiesSet() throws Exception {
		// final AtomicInteger k=new AtomicInteger(0);
		Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {
			Long k = redisTemplate.opsForValue().increment("k");
			String v = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
			// 往 mystream 中写入消息
			// 相当于执行命令 XADD mystream * id 20210101010101 name name20210101010101
			// 消息积累太多，Stream的链表岂不是很长，内容会不会爆掉就是个问题了。xdel指令又不会删除消息，它只是给消息做了个标志位。
			// Redis自然考虑到了这一点，所以它提供了一个定长Stream功能。在xadd的指令提供一个定长长度maxlen，就可以将老的消息干掉，确保最多不超过指定长度。
			// **为保证stream 不太长 ,可以设置maxlen ，执行后多列截断为3，可以定时清理 ,只是保证本次截断stream，应用时要小心，防止消息丢失
			// xadd mystream maxlen 3 * name xiaorui age 1
			redisTemplate.opsForStream().add(RedisStreamConfig.TOPIC_MYSTREAM,
					Map.of("id", String.valueOf(k), "name", "name" + v));
			System.out.println("++++++++->" + k);
		}, 0, 1, TimeUnit.SECONDS);
	}

}
